# -*- coding: utf-8 -*-
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
"""

from django.test import TestCase
from django.conf import settings

from news.models import NewsDetail, NewsEdition, NewsCategory, NewsCluster, ClusterSummary, DailySummary
from basic_info.models import Stock, Institute
from financial_daily.utils import TextCounter
from financial_daily.summarizer import NewsSummarizer
from financial_daily.entity_processors import InstitutionNameProcessor

from financial_daily.clusterer import NewsClusterer
from financial_daily.simhash_deduper import SimhashDeduper

#tasks test
from news.tasks import import_daily_headlines
from news.tasks import generate_daily_news_summary
from news.tasks import cluster_daily_news
    
class NewsSummarizerTests(TestCase):

    DOC_TITLE = u'金融街：商务地产龙头 储备项目潜力大'
    DOC_CONTENT = u'金融街的长期发展战略规划是以商务地产为主导，以快速销售型项目为补充，在适当的核心地段持有优质物业。从公司近几年的主营业务收入构成来看，房地产开发与销售仍然是最大的营收来源。目前公司的商务地产项目储备建面约224.47万平方米，住宅项目储备建面约541.92万平方米。已开业自持物业建面约47万平方米，占整体储备比例较小。未来几年内公司计划继续扩大自持物业的面积，11年底自持物业将达到62万平方米。 　　 从商业模式的可持续性发展来看，商务地产比纯住宅地产的运营模式更具可持续性。在宏观经济面向好的前提下，商务地产有望在未来几年内保持较快的发展态势。公司的区域发展定位是立足北京，面向全国的重点城市。现有商务地产项目储备集中在北京、天津、重庆和惠州，项目质优潜力大。 　　 未来三年公司可结转资源丰富，可结算建面可能达170万平方米。预计10年和11年的结转收入分别为87亿元和138亿元，营收增长显著。 　　 公司起源于北京金融街，也从金融街的建设中获得了宝贵的经验。目前公司已经在商务地产方面形成了自己的品牌优势、客户资源优势和人才优势。 　　 最新每股净资产为5.03元，最新价格PB为1.48倍，无论是从历史估值还是与同业比较都处于最低水平。目前公司仍处于快速发展的时期，未来业绩增长潜力大。市场估值偏低。给予“谨慎推荐”评级。 　　 盈利预测（单位：百万元）（以当前价格预测）'

    def test_get_term_cliques(self):
        with NewsSummarizer() as summarizer:

            term_cliques = summarizer._get_term_cliques(self.DOC_TITLE, self.DOC_CONTENT)
            jrj = term_cliques[u'金融街']
            
            self.assertEqual(jrj[0], 0)
            self.assertEqual(len(jrj[1]), 3)
            
            swdc = term_cliques[u'商务地产']
            
            self.assertEqual(swdc[0], 13)
            self.assertEqual(len(swdc[1]), 6)
            
            conn_table, table_size, term_list = summarizer._calc_term_connectivity(term_cliques)
            idx_swdc = self.get_term_index(u'商务地产', term_list)
            idx_xmcb = self.get_term_index(u'项目储备', term_list)
            
            self.assertEqual(conn_table[idx_swdc, idx_xmcb], 1.0)
            #self.print_term_list(term_list)
      
    def test_get_keywords(self):
        with NewsSummarizer() as summarizer:
            keywords = summarizer.get_keywords(self.DOC_TITLE, self.DOC_CONTENT, True, False)
            self.assertTrue(u'商务地产' in keywords)
            self.assertTrue(u'金融街' in keywords)
            self.assertFalse(u'建面' in keywords)

    def get_term_index(self, term, term_list):
        for idx in xrange(0, len(term_list), 1):
            if term == term_list[idx][0]:
                return idx
        return -1

    def print_term_list(self, term_list):
        for item in term_list:
            print item[0], item[1] 

    def test_export_sentences(self):
        with NewsSummarizer() as summarizer:
            sentence_term_lists = summarizer._export_sentences(self.DOC_TITLE, self.DOC_CONTENT)
            first_sent = sentence_term_lists[0]
            self.assertTrue(u'金融街' in first_sent[0])
            self.assertTrue(u'销售型项目' in first_sent[0])
            self.assertFalse(u'盈利预测' in first_sent[0])
      
    def test_break_sentences(self):
        with NewsSummarizer() as summarizer:
            sents = summarizer.get_sentences(self.DOC_TITLE, self.DOC_CONTENT)
            self.assertTrue(len(sents), 18)

    def test_get_gist_sentences(self):
        with NewsSummarizer() as summarizer:
            sents = summarizer.get_gist_sentences(self.DOC_TITLE, self.DOC_CONTENT)
            self.assertTrue(u'公司的区域发展定位是立足北京，面向全国的重点城市', sents[0])

class TermProcessorsTests(TestCase):
    URL = u'http://stock.stockstar.com/SS2014010900001657.shtml'
    TITLE = u'东方证券1月9日晨会纪要'
    CONTENT = u"""经济企稳带动工控行业 2014 年趋势向上,自动化和进口替代驱动行业加速增长。工控行业自2011 年中开始显着受到宏观经济影响,加上去库存,2012 年工控行业需求下滑 14.4%,2013 年随着经济企稳工控行业开始弱复苏,预计增长 6.5%,2014 年工控行业需求进一步向好,预计同比增长 10%以上。装备制造业的自动化升级随着人工成本见涨越来越迫切,机器人技术的成熟和国产化让自动化升级成为现实,自动化升级成为工控行业主要驱动因素。变频和伺服 70%多依然是外资品牌,用户对国产品牌的认可度逐步在提升,国产品牌实力增强,性价比优势越来越明显,也进一步驱动工控行业加速增长。 英威腾逐步掌握变频核心技术,并逐步开发专机,经销商数量多体系全,相对优势逐步增强。英威腾从代理变频器开始,从汇川技术引入张科孟为核心的技术团队,打造低压变频的技术平台,先后推出矢量变频技术的 CH 系列、GD 系列产品 ,去年开始也逐步在行业专机上开始攻关,推出空压、起重、供水等行业专机,技术能力在持续积累和提升之中。英威腾的经销商数量超过 100家,国外签约经销商超过 60 家,随着公司产品线增多,销售协调效应增强,尤其是今年激励机制上新产品返点多将有力带动整体销售。基于公司研发上的持续投入和经销商队伍强大,英威腾开始显着超越很多二三线变频器企业,品牌优势在逐步增强。 收购企业整合,多个产品扭亏为盈进入收获期。英威腾在 2010 年上市后为了完善产品线收购了一系列的企业,但是由于处于行业高点和资本市场高点,收购的成本偏高,但是经过 3 年的融合和梳理,随着行业的回暖,多个产品开始放量增长,2013 年开始扭亏或减亏,未来三年预计收入均有望保持 40%以上的增长。UPS 电源定位高端,出口做的出色,国内已进入政府采购目录,2013年预计销售 7000 多万,无锡德式卡勒的电梯一体机预计 5000 多万的销售,上海御能的伺服系统在纺机和注塑机领域有所积累,预计销售超过 5000 多万,西安合升的电主轴产品,伺服电机已被 KUKA采购使用,还有交通技术公司做的机车牵引系统也在测试中,众多新产品都将在未来对公司有较大的增量贡献。 新宝股份本次拟公开发行不超过7,600万股。发行后总股本不超过4.42亿股,并在深交所中小板上市。……[详情] 新闻直通车 热点 新闻 股票 证券之星十大名博,直播室全天直播大盘、指导股市操作。……[详情] 互动社区 博客精粹 赶牛热议"""

    def setUp(self):
        self.add_stock_and_institute_info()

    def add_stock_and_institute_info(self):
        Stock.objects.create(code='002334',
                             short_name=u'英威腾',
                             pinyin_name='ywt',
                             full_name=u'深圳市英威腾电气股份有限公司')
        Institute.objects.create(short_name=u'东方证券',
                                 full_name=u'东方证券股份有限公司')

    def test_process_institution_name(self):
        doc_sents_map = dict()
        with NewsSummarizer() as summarizer:

            institute_name_processor = InstitutionNameProcessor()
            summarizer.add_sent_processor(institute_name_processor)

            doc_url = self.URL
            institute_name_processor.set_current_doc_id(doc_url, title=self.TITLE)
            sentences = summarizer.get_sentences(self.TITLE, self.CONTENT)
            doc_sents_map[doc_url] = sentences
        
        stock_doc_id_map = institute_name_processor.get_stock_doc_id_map()
        #for sec_name, doc_set in sorted(stock_doc_id_map.iteritems(), key=lambda x: len(x[1]), reverse=True): 
        self.assertTrue(stock_doc_id_map.has_key(u'英威腾'))
        self.assertEqual(len(stock_doc_id_map[u'英威腾']), 1)
        self.assertTrue(stock_doc_id_map[u'英威腾'].has_key((self.URL, u'东方证券')))
        sent_id = stock_doc_id_map[u'英威腾'][(self.URL, u'东方证券')]
        self.assertTrue(doc_sents_map[self.URL][sent_id], u'英威腾逐步掌握变频核心技术,并逐步开发专机,经销商数量多体系全,相对优势逐步增强')

class NewsTests(TestCase):
    def test_import_daily_headlines(self):
        from news.tasks import import_daily_headlines
        from news.models import NewsDetail 
        date_str = '2013-07-28'
        import_daily_headlines(date_str)
        self.assertEqual(NewsDetail.objects.all().count(), 2)
        self.assertEqual(NewsDetail.objects.filter(add_succeeded=True).count(), 2)

class NewsClustererTests(TestCase):

    DOCUMENTS={
        0:u'IPO 证监会 人民银行 房地产 QFII 外汇局 新股 RQFII 中国石化 新股发行',
        1:u'新股定价 IPO 新股 我武生物 策略报告 新股发行 新股行情 新兴产业 打新 安科生物',
        2:u'IPO 新股 新股发行 我武生物 博时基金 贵人鸟 易事特 打新 招股 东易日盛',
        3:u'IPO 新股发行 中小盘 证监会 带动大盘 汇金 科技网络股 回购政策 中小板指数 中小板',
        4:u'影子银行 互联网金融 银监会 央行 保监会 资金池 网络融资平台 监管 金融创新 信托公司',
        5:u'影子银行 银监会 金融监管 银行理财 信托公司 周小川 保监会 银信合作 风险防控 典当行',
        6:u'影子银行 李少君 人民银行 IPO 第三方支付 银监会 银行业 小贷公司 证券期货机构 融资',
        7:u'影子银行 银监会 人民银行 小贷公司 民间借贷 资金池 央行 理财产品 银行业 发改委',
        8:u'李少君 影子银行 人民银行 第三方支付 银监会 银行业 小贷公司 融资 钱荒 典当行',
        9:u'邵逸夫 邵逸夫奖 邵氏兄弟 香港TVB 香港 影视王国 香港电台 香港电视广播 诺贝尔 上海商会',
        10:u'邵逸夫 邵氏兄弟 梁振英 个人门户 邵逸夫奖 香港TVB 香港 小行星 香港特首 香港电视广播',
        11:u'邵逸夫 影视王国 邵氏兄弟 TVB 香港TVB 香港电视广播 中国电影业 电影公司 香港 网易',
        12:u'邵逸夫 邵氏兄弟 香港 尔冬升 邵氏 电影市场 电影工业 电影 武侠片 地产业务',
        13:u'邵逸夫 邵氏兄弟 香港 尔冬升 邵氏 电影市场 电影工业 电影 武侠片 地产业务',
        14:u'中国中铁 铁道部 房地产 铁路建设 中铁 铁路系统 高管 铁路债务 铁路 BT项目',
        15:u'中国中铁 铁道部 房地产 铁路建设 中铁 铁路系统 高管 铁路债务 铁路 BT项目',
    }

    def setUp(self):
        self.news_clusterer = NewsClusterer()

    def test_hclustering(self):
        data_list=[] 
        for id in self.DOCUMENTS:
            data_list.append(self.DOCUMENTS[id].split(' '))
        clust_list = self.news_clusterer.cluster(data_list)
        self.assertEqual(len(clust_list),4)
        for clust in clust_list:
            if 0 in clust:
                self.assertEqual(clust,set([0,1,2,3]))
                continue
            if 4 in clust:
                self.assertEqual(clust,set([4,5,6,7,8]))
                continue
            if 9 in clust:
                self.assertEqual(clust,set([9,10,11,12,13]))
                continue
            if 14 in clust:
                self.assertEqual(clust,set([14,15]))
                continue

            self.assertTrue(False)

class SimhashDeduperTests(TestCase):

    def setUp(self):
        self.deduper = SimhashDeduper() 

    def test_all_same(self):
        documents={
            1:u'中国中铁 铁道部 房地产 铁路建设 中铁 铁路系统 高管 铁路债务 铁路 BT项目',
            2:u'中国中铁 铁道部 房地产 铁路建设 中铁 铁路系统 高管 铁路债务 铁路 BT项目',
            }

        self.assertFalse(self.deduper.is_dupe(1, documents[1]))
        self.assertTrue(self.deduper.is_dupe(2,documents[2]))

    def test_partial_same(self):
        documents={
            1:u'中国中铁 铁道部 房地产 铁路建设 中铁 铁路系统 高管 铁路债务 铁路 BT项目',
            2:u'中国中铁 房地产 铁路建设 中铁 铁路系统 高管 铁路债务 铁路 BT项目',
            }

        self.assertFalse(self.deduper.is_dupe(1, documents[1]))
        self.assertTrue(self.deduper.is_dupe(2,documents[2]))

    def test_different(self):
        documents={
            1:u'中国中铁 铁道部 房地产 铁路建设 中铁 铁路系统 高管 铁路债务 铁路 BT项目',
            2:u'邵逸夫 邵氏兄弟 香港 尔冬升 邵氏 电影市场 电影工业 电影 武侠片 地产业务',
            }

        self.assertFalse(self.deduper.is_dupe(1, documents[1]))
        self.assertFalse(self.deduper.is_dupe(2,documents[2]))

class TextCounterTests(TestCase):
    def test_get_top_keywords(self):
        keyword_str_list = [u'影子银行 互联网金融 银监会 央行 保监会 资金池 网络融资平台 监管 金融创新 信托公司',
                            u'李少君 影子银行 人民银行 第三方支付 银监会 银行业 房地产 小贷公司 融资 证券期货机构',
                            u'银监会 民间资本 房地产 小贷公司 阎庆民 民资 小微 信托业务 生前遗嘱 影子银行',
                           ]

        top_keywords = TextCounter.get_top_keywords(keyword_str_list, 
                                                    settings.NEWS_SUMMARIZER_PARAMS['max_keywords_returned'])
        self.assertEqual(top_keywords[0], u'银监会')
        self.assertEqual(top_keywords[1], u'影子银行')
        self.assertEqual(top_keywords[2], u'房地产')
        self.assertEqual(top_keywords[3], u'小贷公司')

class ImportDailyHeadlinesSummaryCluster(TestCase):

    def setUp(self):
        self.date_str='2013-07-28'
        self.edition=NewsEdition.MORNING
        self.category=NewsCategory.HEADLINE

    def test_import_daily_headline_summary_cluster(self):
        # 加载数据
        import_daily_headlines(date=self.date_str)
        self.assertEqual(NewsDetail.objects.all().count(), 2)
        # 产生news_summary
        generate_daily_news_summary(category=self.category, edition=self.edition,date=self.date_str)
        self.assertEqual(DailySummary.objects.all().count(), 1)
        # 进行聚类
        cluster_daily_news(category=self.category,date=self.date_str)

        self.assertEqual(NewsCluster.objects.all().count(), 2)
        self.assertEqual(ClusterSummary.objects.all().count(), 2)

